<!DOCTYPE html>
<html>
	<head>
		<meta charset="UTF-8">
		<title></title>
	</head>
	<body>
	</body>
	<script>
		//Set创建的数组是一个伪数组，length-->size，且没有keys()方法，但是可以用于数组去重
		const s = new Set(['a','a','a','b','c']);
		console.log(s,s.size);
		['a','b','a','c','d','b','a','e','b'].forEach(x => s.add(x));
		for(let item of s){
			console.log(item);
		}
		const arr = ['a','b','c','d','e'];
		for(let index of arr.keys()){
			console.log(index);
		}
		for(let index of s.keys()){
			console.log(index);
		}
		//对于数字数组去重也可以
		const s1 = new Set();
		[121,11,12,21,12,11,121].forEach(x => s1.add(x));
		console.log(s1);
		
		//set的操作方法：add(value),delete(value),has(value),clear()
		
		//Array.from()方法可以把Set方法创建的伪数组转换为数组
		console.log(Array.from(s),Array.from(s).length);
		//也可以用扩展运算符将Set的实例转换为数组
		console.log([...s],[...s].length);
		//扩展运算符与Set结合
		let arr1 = [1,11,11,1,1,11];
		console.log([...new Set(arr1)]);
		
		//遍历操作:keys(),values(),entries(),forEach()
		//keys()返回键名，values()返回键值，Set创建的伪数组只有键值，所以键名==键值
		//keys()和values()返回的值一样
		for(let item of s.values()){
			console.log(item);
		}
		for(let index of s.keys()){
			console.log(index);
		}
		for(let [key,value] of s.entries()){
			console.log(key,value);
		}
		for(let item of s){
			console.log(item);
		}
		
		//Set结构的实例也跟数组一样有forEach方法
		s.forEach((value,key) => {
			console.log(`${key}:${value}`);
		})
		
		//Set结构的实例用扩展运算符转换成数组之后有map和filter方法
		let numS = new Set([1,2,3,4,5]);
		console.log([...numS].map(x => x*2));
		console.log([...numS].filter(x => x%2 == 0))
		
		//es5中对象只能是字符串当键名，然后对应键值
		//es6中还允许对象当键名，然后对应键值
		//Map的实例有set(key,value),get(key),has(key),delete(key),.size属性,clear()方法
		//如果对同一个键多次赋值，后面的值会覆盖前面的值
		let hello = {
			hello:'Hello World!'
		};
		let m1 = new Map();
		m1.set(hello,'today...');
		console.log(m1);
		console.log(m1.get(hello));
		
		//Map的实例有keys()、values()、entries()、forEach()方法可以用来遍历
		
		//Map实例转为数组用扩展运算符
		//数组转为Map实例就是把数组当参数传入Map实例
	</script>
</html>
